package com.nas.crocus.domain;

import java.util.Collection;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.codehaus.jackson.map.annotate.JsonDeserialize;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.FetchMode;

import com.nas.crocus.ext.DateJacksonDeserializer;

@Entity
@Table(name = "Evento")
public class Evento {
    /**
     * Id.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "eventoId")
    private Long id;
    
    /**
     * nombre.
     */
    @Column(name = "eventoNombre")
    private String nombre;

    
    @Column(name = "eventoEmpresa")
    private String empresa;
    

    @Column(name = "eventoFechaInicio")
    private Date fechaInicio;
    
    

    @Column(name = "eventoFechaFin")
    private Date fechaFin;
    
    @Column(name = "eventoHabilitado")
    private boolean habilitado;
    
    @Column(name = "eventoSupervisorNombre")
    private String supervisorNombre;
    
    @Column(name = "eventoSupervisorMail")
    private String supervisorMail;
    
    @Column(name = "eventoCantidadAsistentes", nullable = false)
    private Integer cantidadAsistentes;
    
    @OneToMany(cascade=CascadeType.ALL, mappedBy="evento")
    @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
    private Collection<Alojamiento> alojamientos;
    
    @OneToOne(mappedBy = "evento", cascade = CascadeType.ALL)
    private Ruta ruta;
    
    @OneToMany(cascade=CascadeType.ALL, mappedBy="evento")
    private Collection<Actividad> actividades;
    /*
    @OneToOne(mappedBy = "evento", cascade = CascadeType.ALL)
    private RegistroPasajero registroPasajero;
    */
    
    public Evento() {
        this.cantidadAsistentes = 0;
    }
    
    /**
     * Getter Id.
     * @return id.
     */
    public Long getId() {
        return id;
    }

    /**
     * Setter id.
     * @param id a settear.
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * Getter del nombre.
     * @return descripcion.
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * Setter de la descripcion.
     * @param nombre a settear.
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getEmpresa() {
        return empresa;
    }

    /**
     * @return the alojamientosDelEvento
     */
    public Collection<Alojamiento> getAlojamientos() {      
        return alojamientos;
    }

    /**
     * @param alojamientos the alojamientosDelEvento to set
     */
    public void setAlojamientos(Collection<Alojamiento> alojamientos) {
        /*
        if ( (this.alojamientos == null) || (alojamientos == null)) {
            this.alojamientos = alojamientos;
        } else {
            for (Alojamiento alojamiento : alojamientos){
                alojamiento.setEvento(this);
            }
            this.alojamientos.clear();
            this.alojamientos.addAll(alojamientos);
        }*/
        
        for (Alojamiento alojamiento : alojamientos){
            alojamiento.setEvento(this);
        }
        this.alojamientos = alojamientos;
    }

    public void setEmpresa(String empresa) {
        this.empresa = empresa;
    }

    public Date getFechaInicio() {
        return fechaInicio;
    }

    @JsonDeserialize(using=DateJacksonDeserializer.class)
    public void setFechaInicio(Date fechaInicio) {
        this.fechaInicio = fechaInicio;
    }

    public Date getFechaFin() {
        return fechaFin;
    }

    @JsonDeserialize(using=DateJacksonDeserializer.class)
    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }

    public Collection<Actividad> getActividades() {
        return actividades;
    }

    public void setActividades(Collection<Actividad> actividades) {
        for (Actividad actividad : actividades) {
            actividad.setEvento(this);
        }
        this.actividades = actividades;
    }

    /**
     * @return the habilitado
     */
    public boolean isHabilitado() {
        return habilitado;
    }

    /**
     * @param habilitado the habilitado to set
     */
    public void setHabilitado(boolean habilitado) {
        this.habilitado = habilitado;
    }

    public String getSupervisorNombre() {
        return supervisorNombre;
    }

    public void setSupervisorNombre(String supervisorNombre) {
        this.supervisorNombre = supervisorNombre;
    }

    public String getSupervisorMail() {
        return supervisorMail;
    }

    public void setSupervisorMail(String supervisorMail) {
        this.supervisorMail = supervisorMail;
    }

    public Integer getCantidadAsistentes() {
        return cantidadAsistentes;
    }

    public void setCantidadAsistentes(Integer cantidadAsistentes) {
        this.cantidadAsistentes = cantidadAsistentes;
    }

    public Ruta getRuta() {
        return ruta;
    }

    public void setRuta(Ruta ruta) {
        this.ruta = ruta;
    }

//    /**
//     * @return the registroPasajero
//     */
//    public RegistroPasajero getRegistroPasajero() {
//        return registroPasajero;
//    }
//
//    /**
//     * @param registroPasajero the registroPasajero to set
//     */
//    public void setRegistroPasajero(RegistroPasajero registroPasajero) {
//        this.registroPasajero = registroPasajero;
//    }

    
}
